package services

import (
	"fmt"

	"github.com/inntu/backend/api/models"
	"github.com/inntu/backend/config"
	"gorm.io/gorm"
)

// ItemService 项目服务
type ItemService struct {
	db *gorm.DB
}

// NewItemService 创建项目服务实例
func NewItemService() *ItemService {
	return &ItemService{db: config.GetGormDB()}
}

// GetDB 获取数据库连接（兼容性方法）
func (s *ItemService) GetDB() *gorm.DB {
	return s.db
}

// GetItems 获取项目列表
func (s *ItemService) GetItems(parentID *int, contentType string, status *int) ([]models.Item, error) {
	var items []models.Item
	query := s.db.Model(&models.Item{})

	if parentID != nil {
		query = query.Where("parent_id = ?", *parentID)
	}

	if contentType != "" {
		query = query.Where("content_type = ?", contentType)
	}

	if status != nil {
		query = query.Where("status = ?", *status)
	}

	err := query.Order("id ASC").Find(&items).Error
	return items, err
}

// GetItem 获取项目详情
func (s *ItemService) GetItem(id int) (*models.Item, error) {
	var item models.Item
	err := s.db.First(&item, id).Error
	if err != nil {
		return nil, err
	}
	return &item, nil
}

// GetItemWithCategory 获取项目及其分类信息
func (s *ItemService) GetItemWithCategory(id int) (*models.Item, error) {
	var item models.Item
	err := s.db.Preload("Categories").First(&item, id).Error
	if err != nil {
		return nil, err
	}
	return &item, nil
}

// GetItemWithChildren 获取项目及其子项目
func (s *ItemService) GetItemWithChildren(id int) (*models.Item, error) {
	var item models.Item
	err := s.db.Preload("Children").First(&item, id).Error
	if err != nil {
		return nil, err
	}
	return &item, nil
}

// GetItemsByCategory 获取分类下的项目
func (s *ItemService) GetItemsByCategory(categoryID int) ([]models.Item, error) {
	var items []models.Item
	err := s.db.Table("items").
		Joins("JOIN category_items ON category_items.item_id = items.id").
		Where("category_items.category_id = ?", categoryID).
		Order("items.id ASC").
		Find(&items).Error
	return items, err
}

// CreateItem 创建项目
func (s *ItemService) CreateItem(item *models.Item) error {
	return s.db.Create(item).Error
}

// UpdateItem 更新项目
func (s *ItemService) UpdateItem(item *models.Item) error {
	// 使用Omit排除created_at字段，避免更新创建时间
	return s.db.Omit("created_at").Save(item).Error
}

// DeleteItem 删除项目（软删除）
func (s *ItemService) DeleteItem(id int) error {
	return s.db.Delete(&models.Item{}, id).Error
}

// GetItemsByParent 获取父项目下的子项目
func (s *ItemService) GetItemsByParent(parentID int) ([]models.Item, error) {
	return s.GetItems(&parentID, "", nil)
}

// GetCategoryItems 获取分类下的项目（别名方法）
func (s *ItemService) GetCategoryItems(categoryID int) ([]models.Item, error) {
	return s.GetItemsByCategory(categoryID)
}

// AddItemToCategory 将项目添加到分类
func (s *ItemService) AddItemToCategory(itemID, categoryID int) error {
	return s.db.Exec("INSERT INTO category_items (category_id, item_id) VALUES (?, ?)", categoryID, itemID).Error
}

// RemoveItemFromCategory 从分类中移除项目
func (s *ItemService) RemoveItemFromCategory(itemID, categoryID int) error {
	return s.db.Exec("DELETE FROM category_items WHERE category_id = ? AND item_id = ?", categoryID, itemID).Error
}

// SearchItems 搜索项目
func (s *ItemService) SearchItems(keyword string) ([]models.Item, error) {
	var items []models.Item
	err := s.db.Where("name LIKE ? OR description LIKE ?", "%"+keyword+"%", "%"+keyword+"%").
		Order("id ASC").Find(&items).Error
	return items, err
}

// ===== Content API 兼容方法 =====

// GetContentList 方法已移除（兼容旧版API）

// GetContent 方法已移除（兼容旧版API）

// UpdateContent 方法已移除（兼容旧版API）

// DeleteContent 方法已移除（兼容旧版API）

// UploadContent 方法已移除（兼容旧版API）

// GetContentById 方法已移除（兼容旧版API）

// ===== 页面项目关联关系管理方法 =====

// GetItemWithRelatedItems 获取页面项目及其关联的项目
func (s *ItemService) GetItemWithRelatedItems(id int) (*models.Item, error) {
	var item models.Item
	err := s.db.Preload("RelatedItems").First(&item, id).Error
	if err != nil {
		return nil, err
	}
	return &item, nil
}

// AddItemToPageItem 将项目添加到页面项目的关联中
func (s *ItemService) AddItemToPageItem(pageItemID, itemID int, displayOrder int) error {
	// 检查页面项目是否存在且类型为page
	var pageItem models.Item
	err := s.db.First(&pageItem, pageItemID).Error
	if err != nil {
		return fmt.Errorf("页面项目不存在: %v", err)
	}
	if pageItem.ContentType != "page" {
		return fmt.Errorf("项目类型必须为page")
	}

	// 检查关联项目是否存在
	var relatedItem models.Item
	err = s.db.First(&relatedItem, itemID).Error
	if err != nil {
		return fmt.Errorf("关联项目不存在: %v", err)
	}

	// 添加关联关系
	return s.db.Exec("INSERT INTO page_items (page_item_id, item_id, display_order) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE display_order = ?",
		pageItemID, itemID, displayOrder, displayOrder).Error
}

// RemoveItemFromPageItem 从页面项目的关联中移除项目
func (s *ItemService) RemoveItemFromPageItem(pageItemID, itemID int) error {
	return s.db.Exec("DELETE FROM page_items WHERE page_item_id = ? AND item_id = ?", pageItemID, itemID).Error
}

// GetPageItemRelations 获取页面项目的所有关联关系
func (s *ItemService) GetPageItemRelations(pageItemID int) ([]models.Item, error) {
	var items []models.Item
	err := s.db.Table("items").
		Joins("JOIN page_items ON page_items.item_id = items.id").
		Where("page_items.page_item_id = ? AND page_items.status = ?", pageItemID, 1).
		Order("page_items.display_order ASC, items.id ASC").
		Find(&items).Error
	return items, err
}

// UpdatePageItemRelationOrder 更新页面项目关联的显示顺序
func (s *ItemService) UpdatePageItemRelationOrder(pageItemID, itemID, displayOrder int) error {
	return s.db.Exec("UPDATE page_items SET display_order = ? WHERE page_item_id = ? AND item_id = ?",
		displayOrder, pageItemID, itemID).Error
}

// GetItemsRelatedToPageItem 获取与指定页面项目关联的所有项目（反向查询）
func (s *ItemService) GetItemsRelatedToPageItem(itemID int) ([]models.Item, error) {
	var pageItems []models.Item
	err := s.db.Table("items").
		Joins("JOIN page_items ON page_items.page_item_id = items.id").
		Where("page_items.item_id = ? AND page_items.status = ? AND items.content_type = ?", itemID, 1, "page").
		Order("items.id ASC").
		Find(&pageItems).Error
	return pageItems, err
}
